νμ₯ κ°λ₯νκ³ ν¨μ¨μ μΈ λΉ λ°μ΄ν° μ루μ μ μν΄ Hiveλ₯Ό μ¬μ©νμ¬ λ°μ΄ν°λ₯Ό ν¨κ³Όμ μΌλ‘ μ²λ¦¬νλ λ°©λ²μ μμ보μΈμ. μ΄ κ°μ΄λλ μ€μ λΆν° κ³ κΈ μ΅μ νκΉμ§ λͺ¨λ κ²μ λ€λ£Ήλλ€.
Hive μ ν μ²λ¦¬ μμ€ν ꡬμΆ: λ°μ΄ν° κΈ°λ° μ루μ μ μν μ’ ν© κ°μ΄λ
μ€λλ μ λ°μ΄ν° μ€μ¬ μΈμμμ, λ°©λν λ°μ΄ν°μ μ ν¨κ³Όμ μΌλ‘ μ²λ¦¬νκ³ λΆμνλ λ₯λ ₯μ λͺ¨λ κ·λͺ¨μ μ‘°μ§μ λ§€μ° μ€μν©λλ€. μνμΉ νλ‘(Apache Hadoop) μμ ꡬμΆλ λ°μ΄ν° μ¨μ΄νμ°μ€ μμ€ν μΈ Hiveλ λΉ λ°μ΄ν° μ²λ¦¬λ₯Ό μν κ°λ ₯νκ³ νμ₯ κ°λ₯ν μ루μ μ μ 곡ν©λλ€. μ΄ μ’ ν© κ°μ΄λλ μ΄κΈ° μ€μ λΆν° κ³ κΈ μ΅μ ν κΈ°μ μ μ΄λ₯΄κΈ°κΉμ§ ν¨κ³Όμ μΈ Hive μ ν μ²λ¦¬ μμ€ν μ ꡬμΆνλ ν΅μ¬μ μΈ μΈ‘λ©΄λ€μ μλ΄ν©λλ€. μ΄ λ΄μ©μ λ€μν λ°°κ²½κ³Ό μ λ¬Έ μ§μ μμ€μ κ³ λ €νμ¬ μ μΈκ³ λ μλ₯Ό μν΄ μ€κ³λμμ΅λλ€.
Hiveμ λΉ λ°μ΄ν°μμμ μν μ΄ν΄
μνμΉ Hiveλ νλ‘μ μ μ₯λ λκ·λͺ¨ λ°μ΄ν°μ μ 쿼리νκ³ λΆμνλ κ³Όμ μ λ¨μννκΈ° μν΄ μ€κ³λμμ΅λλ€. μ¬μ©μλ HiveQLμ΄λΌλ SQLκ³Ό μ μ¬ν μΈμ΄λ₯Ό μ¬μ©νμ¬ λ°μ΄ν°λ₯Ό 쿼리ν μ μμ΄, SQLμ μ΅μν μ¬λλ€μ΄ λΉ λ°μ΄ν° μμ μ λ μ½κ² ν μ μμ΅λλ€. Hiveλ 쿼리λ₯Ό 맡리λμ€(MapReduce) μμ μΌλ‘ λ³ννμ¬ νλ‘ ν΄λ¬μ€ν°μμ μ€νν©λλ€. μ΄ μν€ν μ²λ νμ₯μ±κ³Ό λ΄κ²°ν¨μ±μ κ°λ₯νκ² νμ¬ ννλ°μ΄νΈ(petabytes) κ·λͺ¨μ λ°μ΄ν°λ₯Ό μ²λ¦¬νλ λ° μ΄μμ μ λλ€.
Hiveμ μ£Όμ νΉμ§:
- SQLκ³Ό μ μ¬ν 쿼리 μΈμ΄(HiveQL): λ°μ΄ν° 쿼리λ₯Ό λ¨μνν©λλ€.
- νμ₯μ±: νλ‘μ λΆμ° μ²λ¦¬ λ₯λ ₯μ νμ©ν©λλ€.
- λ°μ΄ν° μ¨μ΄νμ°μ§: ꡬ쑰νλ λ°μ΄ν° μ μ₯ λ° λΆμμ μν΄ μ€κ³λμμ΅λλ€.
- μ½κΈ° μ μ€ν€λ§ μ μ©(Schema-on-Read): μ€ν€λ§ μ μμ μ μ°μ±μ μ 곡ν©λλ€.
- νμ₯μ±: μ¬μ©μ μ μ ν¨μ λ° λ°μ΄ν° νμμ μ§μν©λλ€.
Hiveλ νλ‘μ 볡μ‘μ±κ³Ό SQLμ μΉμν¨ μ¬μ΄μ κ°κ·Ήμ λ©μμ£Όμ΄, λ λμ λ²μμ μ¬μ©μλ€μ΄ λΉ λ°μ΄ν°μ μ κ·Όν μ μκ² ν©λλ€. ETL(μΆμΆ, λ³ν, μ μ¬) νλ‘μΈμ€, λ°μ΄ν° μ¨μ΄νμ°μ§, μ λνΉ(ad-hoc) 쿼리 λΆμμ νμν©λλ€.
Hive νκ²½ μ€μ νκΈ°
Hiveλ‘ λ°μ΄ν° μ²λ¦¬λ₯Ό μμνκΈ° μ μ νκ²½μ μ€μ ν΄μΌ ν©λλ€. μ΄λ μΌλ°μ μΌλ‘ νλ‘κ³Ό Hiveλ₯Ό μ€μΉνκ³ κ΅¬μ±νλ©°, μ΄λ€μ΄ μλ‘ ν΅μ ν μ μλλ‘ λ³΄μ₯νλ κ³Όμ μ ν¬ν¨ν©λλ€. μ νν λ¨κ³λ μ΄μ 체μ , νλ‘ λ°°ν¬ν, ν΄λΌμ°λ μ 곡μ 체(ν΄λΉνλ κ²½μ°)μ λ°λΌ λ¬λΌμ§λλ€. μ μΈκ³μ μΈ μ μ© κ°λ₯μ±μ μν΄ λ€μ κ°μ΄λλΌμΈμ κ³ λ €νμμμ€.
1. μ¬μ μꡬμ¬ν
μλνλ νλ‘ ν΄λ¬μ€ν°κ° μλμ§ νμΈνμΈμ. μ΄λ μΌλ°μ μΌλ‘ μλ°(Java)μ SSHλ₯Ό ν¬ν¨νμ¬ νλ‘μ μ€μΉνκ³ κ΅¬μ±νλ κ²μ ν¬ν¨ν©λλ€. λν 리λ μ€(μ: Ubuntu, CentOS), macOS λλ μλμ°μ κ°μ μ ν©ν μ΄μ 체μ κ° νμν©λλ€. Amazon EMR, Google Cloud Dataproc, Azure HDInsightμ κ°μ ν΄λΌμ°λ κΈ°λ° μ΅μ μ μ΄ κ³Όμ μ λ¨μνν μ μμ΅λλ€.
2. μ€μΉ λ° κ΅¬μ±
μνμΉ μΉμ¬μ΄νΈλ νλ‘ λ°°ν¬νμ ν¨ν€μ§ κ΄λ¦¬μμμ Hive λ°°ν¬νμ λ€μ΄λ‘λνμΈμ. μ μ© λ¨Έμ μ΄λ νλ‘ ν΄λ¬μ€ν° λ΄ λ Έλμ Hiveλ₯Ό μ€μΉνμΈμ. `hive-site.xml` νμΌμ μμ νμ¬ Hiveλ₯Ό ꡬμ±ν©λλ€. μ£Όμ ꡬμ±μ λ€μκ³Ό κ°μ΅λλ€:
- `hive.metastore.uris`: Hive λ©νμ€ν μ΄(μΌλ°μ μΌλ‘ MySQLμ΄λ PostgreSQLκ³Ό κ°μ λ°μ΄ν°λ² μ΄μ€)μ URIλ₯Ό μ§μ ν©λλ€.
- `hive.metastore.warehouse.dir`: Hive μ¨μ΄νμ°μ€ λλ ν°λ¦¬(λ°μ΄ν°κ° μ μ₯λλ κ³³)μ μμΉλ₯Ό μ μν©λλ€.
- `hive.exec.scratchdir`: μμ νμΌμ μν μ€ν¬λμΉ λλ ν°λ¦¬λ₯Ό μ§μ ν©λλ€.
μμ (κ°μνλ¨):
<property>
<name>hive.metastore.uris</name>
<value>thrift://<metastore_host>:9083</value>
</property>
<property>
<name>hive.metastore.warehouse.dir</name>
<value>/user/hive/warehouse</value>
</property>
3. λ©νμ€ν μ΄ μ€μ
Hive λ©νμ€ν μ΄λ ν μ΄λΈ, νν°μ λ° κΈ°ν λ°μ΄ν° ꡬ쑰μ λν λ©νλ°μ΄ν°λ₯Ό μ μ₯ν©λλ€. λ©νμ€ν μ΄λ‘ μ¬μ©ν λ°μ΄ν°λ² μ΄μ€(μ: MySQL, PostgreSQL, Derby)λ₯Ό μ νν΄μΌ ν©λλ€. MySQLμ μ ννλ κ²½μ° μ μ ν μ¬μ©μ κΆνμΌλ‘ μ€μ νμμμ€. `hive-site.xml` μμ±μ μ¬μ©νμ¬ Hiveκ° λ©νμ€ν μ΄ λ°μ΄ν°λ² μ΄μ€λ₯Ό κ°λ¦¬ν€λλ‘ κ΅¬μ±ν©λλ€.
4. Hive μμνκΈ°
Hive λ©νμ€ν μ΄ μλΉμ€λ₯Ό μμν λ€μ Hive λͺ λ Ήμ€ μΈν°νμ΄μ€(CLI) λλ Beeline ν΄λΌμ΄μΈνΈ(λ κ³ κΈ CLI)λ₯Ό μμν©λλ€. λν Tableau, Power BI λ° κΈ°ν λΆμ νλ«νΌκ³Ό κ°μ λꡬμμ JDBC/ODBC μ°κ²°μ νμ±ννκΈ° μν΄ HiveServer2λ₯Ό μ¬μ©ν μλ μμ΅λλ€.
μλ₯Ό λ€μ΄, Hive CLIλ₯Ό μμνλ €λ©΄:
hive
λ°μ΄ν° λ‘λ© λ° μ€ν€λ§ μ μ
Hive νκ²½μ΄ μ€μ λλ©΄ λ€μ λ¨κ³λ λ°μ΄ν°λ₯Ό λ‘λνκ³ μ€ν€λ§λ₯Ό μ μνλ κ²μ λλ€. Hiveλ λ€μν λ°μ΄ν° νμμ μ§μνλ©° λ°μ΄ν° ꡬ쑰λ₯Ό μ μνκΈ° μν μ μ°ν μ΅μ μ μ 곡ν©λλ€. μμΉμ λ°λΌ λ€λ₯Έ κ΅¬λΆ κΈ°νΈλ₯Ό μ¬μ©νλ CSV νμΌκ³Ό κ°μ κ΅μ λ°μ΄ν° νμμ κ³ λ €νμμμ€.
1. Hiveμμ μ§μνλ λ°μ΄ν° νμ
Hiveλ λ€μμ ν¬ν¨ν μ¬λ¬ λ°μ΄ν° νμμ μ§μν©λλ€:
- ν μ€νΈ νμΌ: (CSV, TSV, μΌλ° ν μ€νΈ) - μΌλ°μ μΌλ‘ μ¬μ©λλ©° κ΄λ¦¬κ° μ½μ΅λλ€.
- μνμ€ νμΌ(Sequence Files): λ°μ΄ν° μ μ₯ λ° κ²μμ μ΅μ νλ νλ‘μ μ΄μ§ νμμ λλ€.
- ORC (Optimized Row Columnar): μ°μν μ±λ₯κ³Ό λ°μ΄ν° μμΆμ μ 곡νλ κ³ λλ‘ μ΅μ νλ μ»¬λΌ κΈ°λ° μ μ₯ νμμ λλ€.
- νμΌμ΄(Parquet): λ°μ΄ν° μ¨μ΄νμ°μ§ λ° λΆμμ μμ£Ό μ¬μ©λλ λ λ€λ₯Έ μ»¬λΌ κΈ°λ° νμμ λλ€.
- JSON: λ°μ ν λ°μ΄ν°λ₯Ό μ μ₯νκΈ° μν νμμ λλ€.
λ°μ΄ν° ꡬ쑰, μ±λ₯ μꡬ μ¬ν λ° μ μ₯μ μꡬ μ¬νμ λ°λΌ νμμ μ ννμμμ€. ORCμ νμΌμ΄λ ν¨μ¨μ± λλ¬Έμ μ’ μ’ μ νΈλ©λλ€.
2. ν μ΄λΈ μμ± λ° μ€ν€λ§ μ μ
`CREATE TABLE` λ¬Έμ μ¬μ©νμ¬ λ°μ΄ν°μ ꡬ쑰λ₯Ό μ μν©λλ€. μ¬κΈ°μλ μ»¬λΌ μ΄λ¦, λ°μ΄ν° μ ν λ° κ΅¬λΆ κΈ°νΈλ₯Ό μ§μ νλ μμ μ΄ ν¬ν¨λ©λλ€. μΌλ°μ μΈ κ΅¬λ¬Έμ λ€μκ³Ό κ°μ΅λλ€:
CREATE TABLE <table_name> (
<column_name> <data_type>,
...
)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY '\t'
STORED AS TEXTFILE;
μμ:
CREATE TABLE employees (
employee_id INT,
first_name STRING,
last_name STRING,
department STRING,
salary DOUBLE
)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ','
STORED AS TEXTFILE;
μ΄ μμμλ λ€μν 컬λΌκ³Ό ν΄λΉ λ°μ΄ν° μ νμ κ°μ§ `employees`λΌλ μ΄λ¦μ ν μ΄λΈμ λ§λλλ€. `ROW FORMAT DELIMITED` λ° `FIELDS TERMINATED BY ','` μ μ ν μ€νΈ νμΌ λ΄μμ λ°μ΄ν°κ° μ΄λ»κ² νμνλλμ§λ₯Ό μ§μ ν©λλ€. λ°μ΄ν° μμ€μ μμΉμ λ°λΌ λ€λ₯Έ κ΅¬λΆ κΈ°νΈ μ¬μ©μ κ³ λ €νμμμ€.
3. Hive ν μ΄λΈλ‘ λ°μ΄ν° λ‘λνκΈ°
`LOAD DATA` λ¬Έμ μ¬μ©νμ¬ Hive ν μ΄λΈλ‘ λ°μ΄ν°λ₯Ό λ‘λν©λλ€. λ‘컬 νμΌμ΄λ HDFSμμ λ°μ΄ν°λ₯Ό λ‘λν μ μμ΅λλ€. μΌλ°μ μΈ κ΅¬λ¬Έμ λ€μκ³Ό κ°μ΅λλ€:
LOAD DATA LOCAL INPATH '<local_file_path>' INTO TABLE <table_name>;
λλ HDFSμμ λ‘λνλ €λ©΄:
LOAD DATA INPATH '<hdfs_file_path>' INTO TABLE <table_name>;
μμ:
LOAD DATA LOCAL INPATH '/path/to/employees.csv' INTO TABLE employees;
μ΄ λͺ λ Ήμ΄λ `employees.csv` νμΌμ λ°μ΄ν°λ₯Ό `employees` ν μ΄λΈλ‘ λ‘λν©λλ€. CSV νμΌμ νμμ΄ ν μ΄λΈμ μ€ν€λ§μ μΌμΉνλμ§ νμΈν΄μΌ ν©λλ€.
4. ν μ΄λΈ νν°μ λ
νν°μ λμ νλ μ΄μμ 컬λΌ(μ: λ μ§, μ§μ)μ κΈ°μ€μΌλ‘ ν μ΄λΈμ λ μμ λΆλΆμΌλ‘ λλμ΄ μΏΌλ¦¬ μ±λ₯μ ν₯μμν΅λλ€. μ΄λ₯Ό ν΅ν΄ Hiveλ 쿼리 μ κ΄λ ¨ λ°μ΄ν°λ§ μ½μ μ μμ΅λλ€. νν°μ λμ μκ°μ΄λ μμΉλ³λ‘ ꡬ쑰νλ λ°μ΄ν°μ μ λ§€μ° μ€μν©λλ€.
`CREATE TABLE` λ¬Έμμ `PARTITIONED BY` μ μ μ¬μ©νμ¬ νν°μ λ ν μ΄λΈμ λ§λλλ€.
CREATE TABLE sales (
transaction_id INT,
product_id INT,
quantity INT,
sale_date STRING
)
PARTITIONED BY (year INT, month INT)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ',';
νν°μ λ ν μ΄λΈμ λ°μ΄ν°λ₯Ό λ‘λν λλ νν°μ κ°μ μ§μ ν΄μΌ ν©λλ€:
LOAD DATA LOCAL INPATH '/path/to/sales_2023_10.csv' INTO TABLE sales PARTITION (year=2023, month=10);
ν¨κ³Όμ μΈ Hive 쿼리 μμ±νκΈ° (HiveQL)
Hiveλ₯Ό μν SQLκ³Ό μ μ¬ν μΈμ΄μΈ HiveQLμ μ¬μ©νλ©΄ λ°μ΄ν°λ₯Ό 쿼리νκ³ λΆμν μ μμ΅λλ€. HiveQLμ λ§μ€ν°νλ κ²μ λ°μ΄ν°μ μμ κ·μ€ν ν΅μ°°λ ₯μ μΆμΆνλ μ΄μ μ λλ€. κ° μ»¬λΌμ μ¬μ©λλ λ°μ΄ν° μ νμ νμ μΌλμ λμμμ€.
1. κΈ°λ³Έ SELECT λ¬Έ
`SELECT` λ¬Έμ μ¬μ©νμ¬ ν μ΄λΈμμ λ°μ΄ν°λ₯Ό κ²μν©λλ€. μΌλ°μ μΈ κ΅¬λ¬Έμ λ€μκ³Ό κ°μ΅λλ€:
SELECT <column_name(s)> FROM <table_name> WHERE <condition(s)>;
μμ:
SELECT employee_id, first_name, last_name
FROM employees
WHERE department = 'Sales';
2. WHERE μ λ‘ λ°μ΄ν° νν°λ§νκΈ°
`WHERE` μ μ μ§μ λ 쑰건μ λ°λΌ λ°μ΄ν°λ₯Ό νν°λ§ν©λλ€. λΉκ΅ μ°μ°μ(μ: =, !=, <, >)μ λ Όλ¦¬ μ°μ°μ(μ: AND, OR, NOT)λ₯Ό μ¬μ©νμ¬ νν° κΈ°μ€μ ꡬμ±ν©λλ€. null κ°μ μν₯κ³Ό κ²°κ³Όμ λ―ΈμΉ μ μλ μν₯μ κ³ λ €νμμμ€.
μμ:
SELECT * FROM sales WHERE sale_date > '2023-01-01' AND quantity > 10;
3. GROUP BY λ° HAVINGμΌλ‘ λ°μ΄ν° μ§κ³νκΈ°
`GROUP BY` μ μ νλ μ΄μμ 컬λΌμμ λμΌν κ°μ κ°μ§ νμ μμ½ νμΌλ‘ κ·Έλ£Ήνν©λλ€. `HAVING` μ μ κ·Έλ£Ήνλ λ°μ΄ν°λ₯Ό 쑰건μ λ°λΌ νν°λ§ν©λλ€. `COUNT`, `SUM`, `AVG`, `MIN`, `MAX`μ κ°μ μ§κ³ ν¨μλ `GROUP BY`μ ν¨κ» μ¬μ©λ©λλ€.
μμ:
SELECT department, COUNT(*) AS employee_count
FROM employees
GROUP BY department
HAVING employee_count > 5;
4. ν μ΄λΈ μ‘°μΈνκΈ°
`JOIN` μ μ μ¬μ©νμ¬ κ³΅ν΅ μ»¬λΌμ κΈ°μ€μΌλ‘ μ¬λ¬ ν μ΄λΈμ λ°μ΄ν°λ₯Ό κ²°ν©ν©λλ€. Hiveλ `INNER JOIN`, `LEFT OUTER JOIN`, `RIGHT OUTER JOIN`, `FULL OUTER JOIN` λ± λ€μν μ‘°μΈ μ νμ μ§μν©λλ€. μ‘°μΈ μμκ° μ±λ₯μ λ―ΈμΉλ μν₯μ μΈμ§ν΄μΌ ν©λλ€.
μμ:
SELECT e.first_name, e.last_name, d.department_name
FROM employees e
JOIN departments d ON e.department = d.department_id;
5. λ΄μ₯ ν¨μ μ¬μ©νκΈ°
Hiveλ λ¬Έμμ΄ ν¨μ, λ μ§ ν¨μ, μν ν¨μ λ± λ°μ΄ν° μ‘°μμ μν νλΆν λ΄μ₯ ν¨μ μΈνΈλ₯Ό μ 곡ν©λλ€. μ΄λ¬ν ν¨μλ₯Ό μ€ννμ¬ μλ λ°©μμ νμΈνκ³ λ³νμ΄ νμνμ§ νμΈνμμμ€.
μμ (λ¬Έμμ΄ ν¨μ):
SELECT UPPER(first_name), LOWER(last_name) FROM employees;
μμ (λ μ§ ν¨μ):
SELECT sale_date, YEAR(sale_date), MONTH(sale_date) FROM sales;
μ±λ₯μ μν Hive 쿼리 μ΅μ ν
λ°μ΄ν°μ μ΄ μ»€μ§μ λ°λΌ 쿼리 μ±λ₯μ΄ μ€μν΄μ§λλ€. λͺ κ°μ§ κΈ°μ μ Hive 쿼리μ ν¨μ¨μ±μ ν¬κ² ν₯μμν¬ μ μμ΅λλ€. μ΄λ¬ν κΈ°μ μ ν¨κ³Όλ λ°μ΄ν°, ν΄λ¬μ€ν° κ΅¬μ± λ° μΏΌλ¦¬μ 볡μ‘μ±μ λ°λΌ λ¬λΌμ§λλ€. μ΅μ νλ₯Ό ꡬννκΈ° μ νμ νμ μΈ‘μ νμ¬ κ°μΉλ₯Ό μ 곡νλμ§ νμΈνμμμ€.
1. 쿼리 μ΅μ ν κΈ°μ
- νν°μ λ(Partitioning): μμ μΈκΈνλ―μ΄, κ΄λ ¨ 컬λΌ(μ: λ μ§, μ§μ)μ κΈ°λ°μΌλ‘ ν μ΄λΈμ νν°μ λνλ©΄ 쿼리 μ€μ μ€μΊλλ λ°μ΄ν°μ μμ΄ μ€μ΄λλλ€.
- λ²ν·ν (Bucketing): λ²ν·ν μ νν°μ λ΄μ λ°μ΄ν°λ₯Ό λ μκ³ κ΄λ¦¬νκΈ° μ¬μ΄ λ¨μλ‘ λλλλ€. μ΄λ νΉν μ‘°μΈμ΄ ν¬ν¨λ 쿼리μ μ±λ₯μ ν₯μμν¬ μ μμ΅λλ€.
- μΈλ±μ±(Indexing): Hiveλ 쿼리 μλλ₯Ό λμ΄κΈ° μν΄ νΉμ 컬λΌμ λν μΈλ±μ±μ μ§μν©λλ€. κ·Έλ¬λ μΈλ±μ± μ€λ²ν€λκ° λͺ¨λ μν©μμ μ΄μ μ λ₯κ°ν μ μμ΅λλ€.
- 벑ν°ν(Vectorization): Hiveκ° ν λ²μ μ¬λ¬ νμ λ°°μΉλ₯Ό μ²λ¦¬ν μ μκ² νμ¬ CPU μ¬μ©λμ μ€μ΄κ³ μ±λ₯μ ν₯μμν΅λλ€. μ΄λ μ΅μ λ²μ μμλ μ’ μ’ κΈ°λ³Έμ μΌλ‘ νμ±νλ©λλ€.
- 쿼리 κ³ν λΆμ: `EXPLAIN` λͺ λ Ήμ μ¬μ©νμ¬ μΏΌλ¦¬ κ³νμ λΆμνμ¬ Hiveκ° μΏΌλ¦¬λ₯Ό μ²λ¦¬νλ λ°©μμ μ΄ν΄νκ³ μ μ¬μ μΈ λ³λͺ© νμμ μλ³ν©λλ€.
2. λ°μ΄ν° νμ λ° μ μ₯μ μ΅μ ν
- μ¬λ°λ₯Έ μ μ₯ νμ μ ν: ORCμ νμΌμ΄(Parquet)λ ν μ€νΈ νμΌμ λΉν΄ μλΉν μ±λ₯ μ΄μ μ μ 곡νλ κ³ ν¨μ¨ μ»¬λΌ κΈ°λ° μ μ₯ νμμ λλ€.
- λ°μ΄ν° μμΆ: Snappy, Gzip λλ LZOμ κ°μ λ°μ΄ν° μμΆ μ½λ±μ μ¬μ©νμ¬ μ μ₯ 곡κ°μ μ€μ΄κ³ 쿼리 μ±λ₯μ ν₯μμν΅λλ€.
- λ°μ΄ν° ν¬κΈ° κ΄λ¦¬: ν΄λ¬μ€ν°κ° ν¨κ³Όμ μΌλ‘ κ΄λ¦¬ν μ μλ λ°μ΄ν° λ³Όλ₯¨μ μ²λ¦¬νκ³ μλμ§ νμΈνμμμ€. λ°μ΄ν° νν°μ λμ λκ·λͺ¨ λ°μ΄ν°μ μ λμμ΄ λ μ μμ΅λλ€.
3. μ΅μ νλ₯Ό μν κ΅¬μ± μ€μ
쿼리 μ€νμ μ΅μ ννκΈ° μν΄ Hive κ΅¬μ± μ€μ μ μμ ν©λλ€. λͺ κ°μ§ μ€μν μ€μ μ λ€μκ³Ό κ°μ΅λλ€:
- `hive.exec.parallel`: λ§΅ λ° λ¦¬λμ€ μμ μ λ³λ ¬ μ€νμ νμ±νν©λλ€.
- `hive.mapjoin.smalltable.filesize`: λ§΅ μ‘°μΈ(μμ ν μ΄λΈμ ν° ν μ΄λΈκ³Ό λ©λͺ¨λ¦¬μμ μ‘°μΈ)μ μ¬μ©λ μ μλ ν μ΄λΈμ μ΅λ ν¬κΈ°λ₯Ό μ μ΄ν©λλ€.
- `hive.optimize.skewjoin`: λ°μ΄ν° νΈν₯(μΌλΆ ν€κ° λ€λ₯Έ ν€λ³΄λ€ ν¨μ¬ λ μμ£Ό λνλλ λ°μ΄ν°)μ΄ μλ μ‘°μΈμ μ΅μ νν©λλ€.
- `hive.compute.query.using.stats`: λ λμ 쿼리 μ€ν κ³νμ λ§λ€κΈ° μν΄ ν μ΄λΈ ν΅κ³λ₯Ό νμ©ν©λλ€.
μμ (λ³λ ¬ μ€ν ꡬμ±):
SET hive.exec.parallel=true;
4. λΉμ© κΈ°λ° μ΅μ ν (CBO)
CBOλ ν μ΄λΈ ν΅κ³λ₯Ό νμ©νμ¬ λ ν¨μ¨μ μΈ μΏΌλ¦¬ μ€ν κ³νμ μμ±νλ κ³ κΈ μ΅μ ν κΈ°μ μ λλ€. λ°μ΄ν° λΆν¬, ν μ΄λΈ ν¬κΈ° λ° κΈ°ν μμλ₯Ό λΆμνμ¬ μΏΌλ¦¬λ₯Ό μ€ννλ μ΅μμ λ°©λ²μ κ²°μ ν©λλ€. λ€μμ μ€μ νμ¬ CBOλ₯Ό νμ±νν©λλ€:
SET hive.cbo.enable=true;
CBOμ νμν μ 보λ₯Ό μ 곡νκΈ° μν΄ ν μ΄λΈ ν΅κ³λ₯Ό μμ§ν©λλ€. λ€μ λͺ λ Ήμ μ¬μ©νμ¬ μ΄ μμ μ μνν μ μμ΅λλ€:
ANALYZE TABLE <table_name> COMPUTE STATISTICS;
λ μμΈν μ»¬λΌ ν΅κ³λ₯Ό μν΄ `ANALYZE TABLE <table_name> COMPUTE STATISTICS FOR COLUMNS <column_name1>,<column_name2>;` μ€νμ κ³ λ €νμμμ€.
κ³ κΈ Hive κΈ°μ
κΈ°λ³Έμ λ§μ€ν°νλ€λ©΄ 볡μ‘ν λ°μ΄ν° μ²λ¦¬ μλ리μ€λ₯Ό μ²λ¦¬νκΈ° μν΄ κ³ κΈ Hive κΈ°μ μ νμν μ μμ΅λλ€.
1. μ¬μ©μ μ μ ν¨μ (UDFs)
UDFλ₯Ό μ¬μ©νλ©΄ μλ°(Java)λ‘ μ¬μ©μ μ μ ν¨μλ₯Ό μμ±νμ¬ Hiveμ κΈ°λ₯μ νμ₯ν μ μμ΅λλ€. μ΄λ 볡μ‘ν λ°μ΄ν° λ³νμ μννκ±°λ Hiveλ₯Ό μΈλΆ μμ€ν κ³Ό ν΅ν©νλ λ° μ μ©ν©λλ€. UDFλ₯Ό λ§λλ λ°λ μλ° νλ‘κ·Έλλ° μ§μμ΄ νμνλ©° λ§€μ° νΉμ ν μμ μμ λ°μ΄ν° μ²λ¦¬λ₯Ό ν¬κ² ν₯μμν¬ μ μμ΅λλ€.
UDF μμ± λ° μ¬μ© λ¨κ³:
- μλ°λ‘ `org.apache.hadoop.hive.ql.udf.UDF` ν΄λμ€λ₯Ό νμ₯νμ¬ UDFλ₯Ό μμ±ν©λλ€.
- μλ° μ½λλ₯Ό JAR νμΌλ‘ μ»΄νμΌν©λλ€.
- `ADD JAR` λͺ λ Ήμ μ¬μ©νμ¬ JAR νμΌμ Hiveμ ν΄λμ€ν¨μ€μ μΆκ°ν©λλ€.
- ν¨μ μ΄λ¦, μλ° ν΄λμ€ μ΄λ¦ λ° JAR νμΌ κ²½λ‘λ₯Ό μ§μ νμ¬ `CREATE FUNCTION` λͺ λ ΉμΌλ‘ Hiveμμ UDFλ₯Ό μμ±ν©λλ€.
- Hive 쿼리μμ UDFλ₯Ό μ¬μ©ν©λλ€.
μμ (κ°λ¨ν UDF): λ¬Έμμ΄μ λλ¬Έμλ‘ λ°κΎΈλ μ΄ UDFλ₯Ό κ³ λ €ν΄λ³΄μΈμ.
// Java UDF
import org.apache.hadoop.hive.ql.exec.UDF;
import org.apache.hadoop.io.Text;
public class Capitalize extends UDF {
public Text evaluate(Text str) {
if (str == null) {
return null;
}
return new Text(str.toString().toUpperCase());
}
}
μ΄κ²μ JAR νμΌ(μ: `Capitalize.jar`)λ‘ μ»΄νμΌν λ€μ λ€μ Hive λͺ λ Ήμ μ¬μ©ν©λλ€.
ADD JAR /path/to/Capitalize.jar;
CREATE FUNCTION capitalize AS 'Capitalize' USING JAR '/path/to/Capitalize.jar';
SELECT capitalize(first_name) FROM employees;
2. μ¬μ©μ μ μ μ§κ³ ν¨μ (UDAFs)
UDAFλ μ¬λ¬ νμ κ±Έμ³ μ§κ³λ₯Ό μνν©λλ€. UDFμ λ§μ°¬κ°μ§λ‘ μλ°λ‘ UDAFλ₯Ό μμ±ν©λλ€. μ λ ₯ λ°μ΄ν°λ₯Ό λ°λ `evaluate()` λ©μλμ λ°λ³΅μ μΈ μ§κ³ κ³Όμ μ μν `iterate()`, `merge()`, `terminatePartial()` λ©μλλ₯Ό μ μνμ¬ μλν©λλ€.
3. μ¬μ©μ μ μ ν μ΄λΈ μμ± ν¨μ (UDTFs)
UDTFλ λ¨μΌ μ λ ₯ νμμ μ¬λ¬ νκ³Ό μ΄μ μμ±ν©λλ€. UDFλ UDAFλ³΄λ€ λ³΅μ‘νμ§λ§ λ°μ΄ν° λ³νμ κ°λ ₯ν©λλ€.
4. λμ νν°μ λ
λμ νν°μ λμ μ¬μ©νλ©΄ Hiveκ° λ°μ΄ν° κ°μ κΈ°λ°μΌλ‘ μλμΌλ‘ νν°μ μ μμ±ν μ μμ΅λλ€. μ΄λ νν°μ λ ν μ΄λΈμ λ°μ΄ν°λ₯Ό λ‘λνλ κ³Όμ μ λ¨μνν©λλ€. `hive.exec.dynamic.partition=true` λ° `hive.exec.dynamic.partition.mode=nonstrict`λ₯Ό μ€μ νμ¬ λμ νν°μ λμ νμ±νν©λλ€.
μμ (λμ νν°μ λ):
SET hive.exec.dynamic.partition=true;
SET hive.exec.dynamic.partition.mode=nonstrict;
INSERT INTO TABLE sales_partitioned
PARTITION (year, month)
SELECT transaction_id, product_id, quantity, sale_date, year(sale_date), month(sale_date)
FROM sales_staging;
5. λ³΅ν© λ°μ΄ν° μ ν
Hiveλ λ°°μ΄, λ§΅, ꡬ쑰체μ κ°μ λ³΅ν© λ°μ΄ν° μ νμ μ§μνμ¬ Hive λ΄μμ μ§μ λ 볡μ‘ν λ°μ΄ν° ꡬ쑰λ₯Ό μ²λ¦¬ν μ μκ² ν©λλ€. μ΄λ‘ μΈν΄ λ°μ΄ν° λ‘λ© μ€μ μ΄λ¬ν μ νμ μ¬μ μ²λ¦¬ν νμκ° μμ΄μ§λλ€.
μμ (ꡬ쑰체 μ¬μ©):
CREATE TABLE contacts (
id INT,
name STRING,
address STRUCT<street:STRING, city:STRING, state:STRING, zip:INT>
);
Hive μ ν μ²λ¦¬λ₯Ό μν λͺ¨λ² μ¬λ‘
ν¨μ¨μ μ΄κ³ μ μ§λ³΄μ κ°λ₯ν Hive μ ν μ²λ¦¬λ₯Ό 보μ₯νκΈ° μν΄ λ€μ λͺ¨λ² μ¬λ‘λ₯Ό λ°λ₯΄μμμ€.
1. λ°μ΄ν° κ±°λ²λμ€ λ° νμ§
- λ°μ΄ν° κ²μ¦: λ°μ΄ν° λ‘λ© λ° μ²λ¦¬ μ€μ λ°μ΄ν° κ²μ¦ κ²μ¬λ₯Ό ꡬννμ¬ λ°μ΄ν° νμ§μ 보μ₯ν©λλ€.
- λ°μ΄ν° κ³λ³΄: λ°μ΄ν°μ μΆμ²μ λ³νμ μ΄ν΄νκΈ° μν΄ λ°μ΄ν° κ³λ³΄λ₯Ό μΆμ ν©λλ€. Apache Atlasμ κ°μ λκ΅¬κ° λμμ΄ λ μ μμ΅λλ€.
- λ°μ΄ν° μΉ΄νλ‘κ·Έ: λ°μ΄ν°, μ€ν€λ§ λ° λ°μ΄ν° μ μλ₯Ό λ¬ΈμννκΈ° μν΄ λ°μ΄ν° μΉ΄νλ‘κ·Έλ₯Ό μ μ§ κ΄λ¦¬ν©λλ€.
2. 쿼리 μ€κ³ λ° μ΅μ ν
- λ°μ΄ν° μ΄ν΄: 쿼리λ₯Ό μμ±νκΈ° μ μ λ°μ΄ν°λ₯Ό μ² μ ν μ΄ν΄ν©λλ€.
- 쿼리 μ΅μ ν: νμ 쿼리λ₯Ό ν μ€νΈνκ³ `EXPLAIN` λͺ λ Ήμ μ¬μ©νμ¬ μ±λ₯ λ³λͺ© νμμ μλ³ν©λλ€.
- νν°μ λ λ° λ²ν·ν μ¬μ©: 쿼리 μ±λ₯μ ν₯μμν€κΈ° μν΄ νν°μ λ λ° λ²ν·ν μ λ΅μ ꡬνν©λλ€.
- μ 체 ν μ΄λΈ μ€μΊ νΌνκΈ°: `WHERE` μ κ³Ό νν°μ μ μ¬μ©νμ¬ μ€μΊλλ λ°μ΄ν°μ μμ μ νν©λλ€.
- ν¨μ¨μ μΈ μ‘°μΈ μ¬μ©: μ‘°μΈ μμμ κ΄λ ¨λ ν μ΄λΈμ ν¬κΈ°λ₯Ό κ³ λ €ν©λλ€. κ°λ₯νλ€λ©΄ `MAPJOIN`μ μ¬μ©νκ³ ν μ΄λΈμ΄ μμ κ²½μ°μ μ¬μ©ν©λλ€.
- λ°μ΄ν° νΈν₯μ λν μ΅μ ν: μΌλΆ ν€κ° λ€λ₯Έ ν€λ³΄λ€ ν¨μ¬ μμ£Ό λνλλ λ°μ΄ν° νΈν₯μ μν (salting)μ΄λ νΈν₯ μ‘°μΈ(skew join)κ³Ό κ°μ κΈ°μ μ μ¬μ©νμ¬ μ²λ¦¬ν©λλ€.
3. 리μμ€ κ΄λ¦¬
- ν΄λ¬μ€ν° 리μμ€ λͺ¨λν°λ§: νλ‘ ν΄λ¬μ€ν°μ 리μμ€ μ¬μ©λ(CPU, λ©λͺ¨λ¦¬, λμ€ν¬ I/O)μ λͺ¨λν°λ§νμ¬ λ³λͺ© νμμ μλ³ν©λλ€.
- 리μμ€ ν λΉ μ‘°μ : μν¬λ‘λμ λ°λΌ Hiveμ 리μμ€ ν λΉ μ€μ (μ: λ©λͺ¨λ¦¬, CPU μ½μ΄)μ ꡬμ±ν©λλ€.
- λμμ± κ΄λ¦¬: ν΄λ¬μ€ν° κ³ΌλΆνλ₯Ό λ°©μ§νκΈ° μν΄ λμ 쿼리 μλ₯Ό μ νν©λλ€.
- νμ μμ€ν : YARNκ³Ό κ°μ 리μμ€ κ΄λ¦¬ μμ€ν μ νμ©νμ¬ λ¦¬μμ€ ν λΉμ κ΄λ¦¬ν©λλ€.
4. λ¬Έμν λ° λ²μ κ΄λ¦¬
- λ°μ΄ν° λ° μΏΌλ¦¬ λ¬Έμν: λͺ νμ±κ³Ό μ μ§λ³΄μμ±μ 보μ₯νκΈ° μν΄ λ°μ΄ν° μ€ν€λ§, 쿼리 λ° ETL νλ‘μΈμ€λ₯Ό λ¬Έμνν©λλ€.
- λ²μ κ΄λ¦¬ μ¬μ©: λ³κ²½ μ¬νμ μΆμ νκ³ νμ μ μ©μ΄νκ² νκΈ° μν΄ Hive μ€ν¬λ¦½νΈμ ꡬμ±μ λ²μ κ΄λ¦¬ μμ€ν (μ: Git)μ μ μ₯ν©λλ€.
- ν μ€ν μ λ΅ κ΅¬ν: Hive μΏΌλ¦¬κ° μμλλ‘ μλνλμ§ νμΈνκΈ° μν ν μ€ν μ λ΅μ λ§λλλ€.
ν΄λΌμ°λ κΈ°λ° Hive μ루μ
λ§μ ν΄λΌμ°λ μ 곡μ μ²΄κ° κ΄λ¦¬ν Hive μλΉμ€λ₯Ό μ 곡νμ¬ λ°°ν¬, κ΄λ¦¬ λ° νμ₯μ λ¨μνν©λλ€. μ¬κΈ°μλ λ€μμ΄ ν¬ν¨λ©λλ€:
- Amazon EMR (Elastic MapReduce): AWSμ κ΄λ¦¬ν νλ‘ λ° μ€νν¬ μλΉμ€μ λλ€.
- Google Cloud Dataproc: Google Cloud Platformμ μμ κ΄λ¦¬ν λ° νμ₯ κ°λ₯ν μ€νν¬ λ° νλ‘ μλΉμ€μ λλ€.
- Azure HDInsight: Microsoft Azureμ κ΄λ¦¬ν νλ‘ μλΉμ€μ λλ€.
μ΄λ¬ν ν΄λΌμ°λ μλΉμ€λ κΈ°λ³Έ μΈνλΌ κ΄λ¦¬μ νμμ±μ μμ κ³ μ΄μ μ€λ²ν€λλ₯Ό μ€μ΄λ©° λ°μ΄ν° λΆμμ μ§μ€ν μ μκ² ν΄μ€λλ€. λν λΉμ© ν¨μ¨μ μΈ νμ₯μ±κ³Ό λͺ¨λν°λ§ λ° κ΄λ¦¬λ₯Ό μν ν΅ν© λꡬλ₯Ό μ 곡νλ κ²½μ°κ° λ§μ΅λλ€.
μΌλ°μ μΈ λ¬Έμ ν΄κ²°
λ€μμ λͺ κ°μ§ μΌλ°μ μΈ Hive κ΄λ ¨ λ¬Έμ μ ν΄κ²°μ± μ λλ€:
- 쿼리 μ±λ₯ λ¬Έμ :
- ν΄κ²°μ± : `EXPLAIN` λͺ λ Ήμ μ¬μ©νμ¬ μΏΌλ¦¬ κ³νμ λΆμν©λλ€. ν μ΄λΈ μ€ν€λ§λ₯Ό μ΅μ ννκ³ , νν°μ λμ μ¬μ©νκ³ , μ‘°μΈμ μ΅μ ννκ³ , Hive μ΅μ ν μ€μ μ ꡬμ±ν©λλ€. 쿼리 κ³νμ κ²ν ν©λλ€. ν΅κ³λ₯Ό νμΈν©λλ€.
- λ©νμ€ν μ΄ μ°κ²° λ¬Έμ :
- ν΄κ²°μ± : λ©νμ€ν μ΄ μλ²κ° μ€ν μ€μ΄κ³ μ κ·Ό κ°λ₯νμ§ νμΈνμΈμ. `hive-site.xml` μ€μ μμ μ¬λ°λ₯Έ λ©νμ€ν μ΄ URIλ₯Ό νμΈνμΈμ. λ©νμ€ν μ΄ μλ²κ° νμν κΆνμ κ°μ§κ³ μλμ§ νμΈνμΈμ. λ©νμ€ν μ΄ μλ²λ‘μ λ€νΈμν¬ μ°κ²°μ μ κ²νμΈμ.
- λ©λͺ¨λ¦¬ λΆμ‘± μ€λ₯:
- ν΄κ²°μ± : HiveServer2 λλ Hive CLIμ μλ° ν ν¬κΈ°(`-Xmx`)λ₯Ό λ립λλ€. νλ‘ λ° Hiveμ λ©λͺ¨λ¦¬ μ€μ (μ: `mapreduce.map.memory.mb`, `mapreduce.reduce.memory.mb`)μ μ‘°μ ν©λλ€. YARN 리μμ€ ν λΉμ ꡬμ±νμ¬ λ©λͺ¨λ¦¬λ₯Ό ν¨κ³Όμ μΌλ‘ κ΄λ¦¬ν©λλ€.
- νμΌμ μ°Ύμ μ μμ μ€λ₯:
- ν΄κ²°μ± : `LOAD DATA` λλ 쿼리 λ¬Έμ νμΌ κ²½λ‘κ° μ¬λ°λ₯Έμ§ νμΈν©λλ€. HDFS λλ λ‘컬 νμΌ μμ€ν μ νμΌμ΄ μ‘΄μ¬νλμ§ νμΈν©λλ€(λ°μ΄ν° λ‘λ λ°©μμ λ°λΌ λ€λ¦). νμΌμ μ κ·Όν μ μλ κΆνμ νμΈν©λλ€.
- νν°μ
λ μ€λ₯:
- ν΄κ²°μ± : νν°μ 컬λΌμ λ°μ΄ν° μ νκ³Ό νμμ νμΈν©λλ€. νν°μ 컬λΌμ΄ `CREATE TABLE` λ° `LOAD DATA` λ¬Έμ μ¬λ°λ₯΄κ² μ§μ λμλμ§ νμΈν©λλ€.
κ²°λ‘
ν¨κ³Όμ μΈ Hive μ ν μ²λ¦¬ μμ€ν μ ꡬμΆνλ €λ©΄ Hiveμ μν€ν μ², λ°μ΄ν° μ μ₯ νμ, 쿼리 μ΅μ ν κΈ°μ λ° λͺ¨λ² μ¬λ‘μ λν κΉμ μ΄ν΄κ° νμν©λλ€. μ΄ μ’ ν© κ°μ΄λμ μ§μΉ¨μ λ°λ₯΄λ©΄ λκ·λͺ¨ λ°μ΄ν°μ μ μ²λ¦¬ν μ μλ κ²¬κ³ νκ³ νμ₯ κ°λ₯ν λ°μ΄ν° μ²λ¦¬ μ루μ μ ꡬμΆν μ μμ΅λλ€. μ΄κΈ° μ€μ λΆν° κ³ κΈ μ΅μ ν λ° λ¬Έμ ν΄κ²°μ μ΄λ₯΄κΈ°κΉμ§, μ΄ κ°μ΄λλ μ μΈκ³μ μΈ νκ²½μμ λ°μ΄ν° κΈ°λ° ν΅μ°°λ ₯μ μν΄ Hiveμ νμ νμ©νλ λ° νμν μ§μκ³Ό κΈ°μ μ μ 곡ν©λλ€. μ§μμ μΈ νμ΅κ³Ό μ€νμ λ°μ΄ν°μμ μ΅λμ κ°μΉλ₯Ό μΆμΆν μ μλλ‘ λμ± νμ μ€μ΄μ€ κ²μ λλ€.